package com.junzhiit.nengji.api.web.util;

import java.io.UnsupportedEncodingException;
import java.security.AlgorithmParameters;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;
import java.security.spec.InvalidParameterSpecException;
import java.util.Arrays;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import com.alibaba.fastjson.JSONObject;

/**
 *  小程序解密获取手机号码或用户信息
 * @author PeterMo
 *
 */
public class AESDecodeUtils {

	 public static void main(String[] args) throws Exception {
	        byte[] encrypData = Base64.decodeBase64("r25Nw08I7hFvd2uIWk77wY/gOmfNTe2QdftkhsYOLCEYBY1T2IT+c2xne9MM36MmlzySEv03Kp5xVFbs84ZHQGIgL76/Iu5uGk7uML75Ybx05aULVz+op9nNudXVi/SZl70ZoyndQkkpceXXF8ElV1TjqWsz1+QWAnk6Np5G3BpSfrUFrM6psciNSKiiIuy2AeA6+8fZIHt2Bm2skaFt2g==");
	        byte[] ivData = Base64.decodeBase64("2jViCMzI79nmb3cyTI5iBw==");
	        byte[] sessionKey = Base64.decodeBase64("+JDFDkIG+xcYJGF1rj+N6Q==");
	        System.out.println(decrypt(sessionKey,ivData,encrypData));
	    }
	 
	/*    public static String decrypt(byte[] key, byte[] iv, byte[] encData) throws Exception {
	        AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);
	        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
	        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
	        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
	        //解析解密后的字符串
	        return new String(cipher.doFinal(encData),"UTF-8");
	    }*/
	    
	    public static JSONObject decrypt(byte[] keyByte, byte[] ivByte, byte[] dataByte){
	        try {
	               // 如果密钥不足16位，那么就补足.  这个if 中的内容很重要
	            int base = 16;
	            if (keyByte.length % base != 0) {
	                int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
	                byte[] temp = new byte[groups * base];
	                Arrays.fill(temp, (byte) 0);
	                System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
	                keyByte = temp;
	            }
	            // 初始化
	            Security.addProvider(new BouncyCastleProvider());
	            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");
	            SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
	            AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
	            parameters.init(new IvParameterSpec(ivByte));
	            cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
	            byte[] resultByte = cipher.doFinal(dataByte);
	            if (null != resultByte && resultByte.length > 0) {
	                String result = new String(resultByte, "UTF-8");
	                return JSONObject.parseObject(result);
	            }
	        } catch (NoSuchAlgorithmException e) {
	            e.printStackTrace();
	        } catch (NoSuchPaddingException e) {
	            e.printStackTrace();
	        } catch (InvalidParameterSpecException e) {
	            e.printStackTrace();
	        } catch (IllegalBlockSizeException e) {
	            e.printStackTrace();
	        } catch (BadPaddingException e) {
	            e.printStackTrace();
	        } catch (UnsupportedEncodingException e) {
	            e.printStackTrace();
	        } catch (InvalidKeyException e) {
	            e.printStackTrace();
	        } catch (InvalidAlgorithmParameterException e) {
	            e.printStackTrace();
	        } catch (NoSuchProviderException e) {
	            e.printStackTrace();
	        }
	        return null;
	    }

}
